﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using CruzDelSur.Models;
using CruzDelSur.Dominio;
//using CruzDelSur.Dominio.Seguridad;
using CruzDelSur.Negocio;
using Microsoft.Reporting.WebForms;
using CruzDelSur.Dominio.Seguridad;

namespace CruzDelSur.Controllers
{
    public class ServiciosRecursosController : Controller
    {
        // IoC
        // GET: /
        ServiciosService ServiciosService { get; set; }
        AdministrarRecursosService RecursosService { get; set; }

        public ActionResult Index()
        {
            return View("Index", RecursosService.obtenerListadoTripulacion());
        }
        // ********************AREA DE RECURSOS *****************************
        [Authorize]
        public ActionResult Recursos()
        {
            return View("Index");
        }

       

        [Authorize]
        public ActionResult Flota()
        {
            // YA NO Sera para flota de carga
            return View("Flota", RecursosService.obtenerListadoFlotaCarga());
        }

        //*  Tripulacion * //
        [Authorize]
        public ActionResult Tripulacion()
        {
            return View("Index", RecursosService.obtenerListadoTripulacion());
        }


        [Authorize]
        public ActionResult CrearTripulacion()
        {
            return View("ActualizarTripulacion");
        }

        [Authorize, HttpPost]
        public ActionResult CrearTripulacion(Tripulacion model)
        {
            model.UsuarioCreado = User.Identity.Name;
            RecursosService.crearTripulacion(model);
            return RedirectToAction("Tripulacion");
            //return View("ActualizarTripulacion", model);
        }

        [Authorize]
        public ActionResult EditarTripulacion(string CodigoEmp, string CodigoCargo)
        {
            return View("ActualizarTripulacion", RecursosService.obtenerTripulacion(CodigoEmp, CodigoCargo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarTripulacion(string CodigoEmp, string CodigoCargo, Tripulacion tmodel)
        {
            tmodel.UsuarioModificado = User.Identity.Name;
            RecursosService.modificarTripulacion(new TripulacionCargoId(CodigoEmp, CodigoCargo), tmodel);
            return RedirectToAction("Tripulacion");
            //return View("ActualizarTripulacion", RecursosService.obtenerTripulacion(codigo[0], codigo[1]));
        }

        [Authorize]
        public ActionResult BajaTripulacion(string CodigoEmp, string CodigoCargo)
        {
            Tripulacion model = RecursosService.obtenerTripulacion(CodigoEmp, CodigoCargo);
            model.FechaBaja.AddMonths(2);
            return View("BajaTripulacion", model);
        }

        [Authorize, HttpPost]
        public ActionResult BajaTripulacion(string CodigoEmp, string CodigoCargo, Tripulacion model)
        {
            try
            {
                model.CodigoEmpleado = CodigoEmp;
                model.CodigoCargo = CodigoCargo;
                model.UsuarioModificado= User.Identity.Name;
                if (RecursosService.darBajaTripulacion(model))
                {
                    return RedirectToAction("Tripulacion");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaTripulacion", model);
        }

        [Authorize]
        public ActionResult ImprimirTripulacion()
        {
            return View("ImprimirTripulacion");
        }

        public JsonResult ListaTripulacion()
        {
            return Json(RecursosService.obtenerListadoTripulacion().Tripulaciones, JsonRequestBehavior.AllowGet);
        }

        #region Flota Carga

        public ActionResult Carga()
        {
            return View("Carga", RecursosService.obtenerListadoFlotaCarga());
        }

        [Authorize]
        public ActionResult CrearFlotaCarga()
        {
            ViewData["FormatDate"] = RecursosService.formatoFecha();
            return View("ActualizarFlotaCarga", RecursosService.crearNuevoFlotaCargaModel());
        }

        [Authorize]
        [HttpPost]
        public ActionResult CrearFlotaCarga(FlotaCargasModel datosForm)
        {
            ViewData["FormatDate"] = RecursosService.formatoFecha();     
            try
             {
                 datosForm.FlotaCarga.CreadoPor = User.Identity.Name;
                 datosForm.FlotaCarga.ModificadoPor = User.Identity.Name;
                 RecursosService.crearFlotaCarga(datosForm.FlotaCarga);
             }
             catch (Exception ex)
             {
                 ModelState.AddModelError(String.Empty, ex.Message + datosForm.FlotaCarga.Codigo);
             }
            return RedirectToAction("Carga");
        }

        [Authorize, HttpGet]
        public ActionResult EditarFlotaCarga(string Codigo)
        {
            return View("ActualizarFlotaCarga", RecursosService.abrirFlotaCargaModel(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarFlotaCarga(string Codigo, FlotaCargasModel datosForm)
        {
            datosForm.Vehiculos = RecursosService.obtenerComboVehiculos("");
            datosForm.FlotaCarga.ModificadoPor = User.Identity.Name;
            RecursosService.modificarFlotaCarga(datosForm.FlotaCarga);
            return RedirectToAction("Carga");
        }

        [Authorize]
        public ActionResult BajaFlotaCarga(string Codigo)
        {
            ViewData["FormatDate"] = RecursosService.formatoFecha();
            return View("BajaFlotaCarga", RecursosService.darBajaFlotaCargaModel(Codigo, FlotaCargaEstadoEnum.EDITAR));
        }

        [Authorize]
        [HttpPost]
        public ActionResult BajaFlotaCarga(string Codigo, FlotaCargasModel model)
        {
            ViewData["FormatDate"] = RecursosService.formatoFecha();
            try
            {
                model.EstadoEdicion = FlotaCargaEstadoEnum.EDITAR;
                if (RecursosService.darBajaFlotaCarga(Codigo, model.FlotaCarga.FechaBaja, new Usuario { Codigo = User.Identity.Name }))
                {
                    return RedirectToAction("Carga");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message + model.FlotaCarga.FechaBaja.ToString());
            }
            return View("BajaFlotaCarga", model);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirTripulacion(string CodigoEmp, string CodigoCargo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/TripulacionReport.rdlc");
            Tripulacion tripulacion = RecursosService.obtenerTripulacion(CodigoEmp, CodigoCargo);

            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(tripulacion.Empleado.Nombre);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Descripcion");
            rp.Values.Add(tripulacion.Cargo.Descripcion);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(tripulacion.Estado));
            localReport.SetParameters(rp);


            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirFlotaPasajero(string CodigoUnidad, string CodigoServ)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/FlotaPasajeroReport.rdlc");
            FlotaPasajero flota = RecursosService.obtenerFlotaPasajero(CodigoUnidad, CodigoServ);

            ReportParameter rp = new ReportParameter("Codigo1");
            rp.Values.Add(flota.CodigoUnidadTransporte);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Codigo2");
            rp.Values.Add(flota.CodigoServicio);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Descripcion");
            string desc = "Número de asientos: " + flota.Numeroasientos + " / " +
                "Número de  ejes: " + flota.NumeroEjes;
            rp.Values.Add(desc);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(flota.Estado));
            localReport.SetParameters(rp);


            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirFlotaCarga(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/FlotaCargaReport.rdlc");
            FlotaCarga flotacarga = RecursosService.obtenerFlotaCarga(Codigo);

            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(flotacarga.Codigo);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Descripcion");
            rp.Values.Add(flotacarga.Vehiculo.Nombre);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Marca");
            rp.Values.Add(flotacarga.Vehiculo.Marca);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Modelo");
            rp.Values.Add(flotacarga.Vehiculo.Modelo);
            localReport.SetParameters(rp);

            string xyAlto = Convert.ToString(flotacarga.AltoBodega);
            rp = new ReportParameter("Alto");
            rp.Values.Add(xyAlto);
            localReport.SetParameters(rp);

            string xyAncho = Convert.ToString(flotacarga.AnchoBodega);
            rp = new ReportParameter("Ancho");
            rp.Values.Add(xyAncho);
            localReport.SetParameters(rp);

            string xyLargo = Convert.ToString(flotacarga.LargoBodega);
            rp = new ReportParameter("Largo");
            rp.Values.Add(xyLargo);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Placa");
            rp.Values.Add(flotacarga.Vehiculo.Placa);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(flotacarga.Estado));
            localReport.SetParameters(rp);


            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }
        #endregion



        // Flota Pasajero


        [Authorize]
        public ActionResult FlotaPasajero()
        {
            return View("FlotaPasajero", RecursosService.obtenerListadoFlotaPasajero());
        }

        [Authorize]
        public ActionResult CrearFlotaPasajero()
        {
            return View("ActualizarFlotaPasajero");
        }

        [Authorize, HttpPost]
        public ActionResult CrearFlotaPasajero(FlotaPasajero flota)
        {
           flota.CreadoPor = User.Identity.Name;
           RecursosService.crearFlotaPasajero(flota);
           return RedirectToAction("FlotaPasajero");
           //return View("ActualizarProyectoEspecial",  ServiciosEspecialesService.procesarProyectoEspecialModel(datosForm));
        }

        [Authorize]
        public ActionResult EditarFlotaPasajero(string CodigoUnidad, string CodigoServ)
        {
            return View("ActualizarFlotaPasajero", RecursosService.obtenerFlotaPasajero(CodigoUnidad, CodigoServ));
        }

        [Authorize, HttpPost]
        public ActionResult EditarFlotaPasajero(string CodigoUnidad, string CodigoServ, FlotaPasajero model)
        {
            model.ModificadoPor = User.Identity.Name;
            RecursosService.modificarFlotaPasajero(model);
            return RedirectToAction("FlotaPasajero");
        }

        [Authorize]
        public ActionResult BajaFlotaPasajero(string CodigoUnidad, string CodigoServ)
        {
            FlotaPasajero model = RecursosService.obtenerFlotaPasajero(CodigoUnidad, CodigoServ);
            model.FechaBaja.AddMonths(2);
            return View("BajaFlotaPasajero", model);
        }

        [Authorize, HttpPost]
        public ActionResult BajaFlotaPasajero(string CodigoUnidad, string CodigoServ, FlotaPasajero model)
        {
            try
            {
                model.CodigoUnidadTransporte = CodigoUnidad;
                model.CodigoServicio = CodigoServ;
                model.ModificadoPor = User.Identity.Name;
                if (RecursosService.darBajaFlotaPasajero(model))
                {
                    return RedirectToAction("FlotaPasajero");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaFlotaPasajero", model);
        }

        //APROBACIONES
        [Authorize]
        public ActionResult AprobarRecursos()
        {
            int defaultValue = 1;
            return View("AprobarRecursos", RecursosService.aprobarRecursoFormModel(defaultValue));
        }

        [Authorize, HttpPost]
        public ActionResult AprobarRecursos(AprobarRecursoFormModel form)
        {
            if (form.BotonSubmit == form.BotonAprobar)
            {
                RecursosService.aprobarRecurso(form);
            }
            return View("AprobarRecursos", RecursosService.aprobarRecursoFormModel(form.TipoRecurso));
        }

        #region Resultados Asincronos
        [Authorize, HttpGet]
        public JsonResult EmpleadosJSON(string nombre)
        {
            return Json(RecursosService.buscarEmpleado(nombre), JsonRequestBehavior.AllowGet);
        }
        #endregion

    }
}
